package com.agentai.framework.satoken.helper;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import com.agentai.framework.satoken.enums.UserType;
import com.agentai.framework.security.user.UserDetail;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * 登录鉴权助手
 * <p>
 * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app
 * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
 * 可以组成 用户类型与设备类型多对多的 权限灵活控制
 * <p>
 * 多用户体系 针对 多种用户类型 但权限控制不一致
 * 可以组成 多用户类型表与多设备类型 分别控制权限
 *
 * @author fuzhilin
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class MpLoginHelper {
    public static final String LOGIN_USER_KEY = "mpLoginUser";
    public static final String JOIN_CODE = ":";
    public static final String USER_KEY = "userId";
    public static final String SUPER_KEY = "superAdmin";
    public static final String MEMBER_PHONE_KEY = "memberPhone";

   /**
     * 登录系统 基于 设备类型
     * 针对相同用户体系不同设备
     *
     * @param loginUser 登录用户信息
     * @param model     配置参数
     */
    public static void login(UserDetail loginUser, SaLoginModel model) {
        model = ObjectUtil.defaultIfNull(model, new SaLoginModel());
        StpUtil.login(loginUser.getId(),
            model
                .setExtra(USER_KEY, loginUser.getId())
                .setExtra(SUPER_KEY, loginUser.getSuperAdmin())
                .setExtra(MEMBER_PHONE_KEY, loginUser.getMobile())
        );
        StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
    }

    /**
     * 获取用户(多级缓存)
     */
    public static UserDetail getLoginUser() {
        SaSession session = StpUtil.getTokenSession();
        if (ObjectUtil.isNull(session)) {
            return null;
        }
        return (UserDetail) session.get(LOGIN_USER_KEY);
    }

    /**
     * 获取用户基于token
     */
    public static UserDetail getLoginUser(String token) {
        SaSession session = StpUtil.getTokenSessionByToken(token);
        if (ObjectUtil.isNull(session)) {
            return null;
        }
        return (UserDetail) session.get(LOGIN_USER_KEY);
    }


    /**
     * 设置用户数据(多级缓存)
     */
    public static void setLoginUser(UserDetail mpLoginUser) {
        StpMpUtil.getTokenSession().set(LOGIN_USER_KEY, mpLoginUser);
    }

    /**
     * 获取用户(多级缓存)
     */
//    public static MpLoginUser getLoginUser() {
//        synchronized (MpLoginHelper.class) {
//            String token = StpMpUtil.getTokenValue();
//            log.info("当前登陆用户的token为: {}", token);
//            SaSession tokenSession = null;
//            try{
//                tokenSession = StpMpUtil.getTokenSessionByToken(token);
//            }catch (Exception ignored){
//            }
//            if (tokenSession == null) {
//                log.warn("无法获取tokenSession，登出当前用户");
//                StpMpUtil.logout();
//                return null;
//            }
//            MpLoginUser mpLoginUser = (MpLoginUser) tokenSession.get(LOGIN_USER_KEY);
//            log.info("从tokenSession中获取登陆用户信息: {}", mpLoginUser);
//
//            if (mpLoginUser == null) {
//                log.warn("无法获取登陆用户信息，登出当前用户");
//                StpMpUtil.logout();
//                return null;
//            }
//            return mpLoginUser;
//        }
//
//    }

    /**
     * 获取用户id
     */
    public static Long getUserId() {
        UserDetail mpLoginUser = getLoginUser();
        if (ObjectUtil.isNull(mpLoginUser)) {
            String loginId = null;
            try{
                loginId =StpMpUtil.getLoginIdAsString();
            }catch (Exception ignored){
            }
            String userId = null;
            for (UserType value : UserType.values()) {
                if (StringUtils.contains(loginId, value.getUserType())) {
                    String[] strs = StringUtils.split(loginId, JOIN_CODE);
                    // 用户id在总是在最后
                    userId = strs[strs.length - 1];
                }
            }
            if (StringUtils.isBlank(userId)) {
//                throw new ServerException(ErrorCode.UNAUTHORIZED);
                return null;
            }
            return Long.parseLong(userId);
        }
        return mpLoginUser.getId();
    }
    /**
     * 获取用户手机号
     */
    public static String getMemberPhone() {
        UserDetail mpLoginUser = getLoginUser();
        if (ObjectUtil.isNull(mpLoginUser)) {
           return "";
        }
        return mpLoginUser.getMobile();
    }

    /**
     * 获取用户账户
     */
    public static String getUserName() {
        UserDetail mpLoginUser = getLoginUser();
        if (ObjectUtil.isNull(mpLoginUser)) {
            return "";
        }
        return mpLoginUser.getUsername();
    }


    /**
     * 获取真实姓名
     */
    public static String getRealName() {
        UserDetail mpLoginUser = getLoginUser();
        if (ObjectUtil.isNull(mpLoginUser)) {
            return "";
        }
        return mpLoginUser.getRealName();
    }




}
